package com.silong.swing.myWindows;

import javax.swing.*;
import javax.swing.undo.UndoManager;
import java.awt.*;
import java.awt.event.*;

/**
 * Created by 龙哥 on 2022-01-17 15:38
 * Silong Software.
 * 文本域框
 * 文本域不支持 ActionListener事件
 */

public class TextAreaFrame extends JFrame {

    JTextArea txaSrc; //文本域框
    JTextArea txaTarget; //目标文本域框
    JButton btnAdd; //添加
    JButton btnInsert;//插入
    JButton btnSelectAll; //选择所有
    JButton btnCopy; //复制
    JButton btnPast; //粘贴
    JButton btnUndo; //撤销
    JButton btnRedo; //重做
    UndoManager undoManager;
    JScrollPane jspSrc;//滚动条
    JScrollPane jspTarget;//滚动条

    public TextAreaFrame(){
        init();
    }

    private void init(){

        undoManager = new UndoManager();

        txaSrc = new JTextArea("");
        txaTarget = new JTextArea("");
        btnAdd = new JButton("添加"); //添加
        btnInsert = new JButton("插入");//插入
        btnSelectAll = new JButton("全选"); //选择所有
        btnCopy  = new JButton("复制"); //复制
        btnPast = new JButton("粘贴"); //粘贴
        btnUndo = new JButton("撤销"); //撤消
        btnRedo = new JButton("重做"); //重做

        //创建滚动条
        jspSrc = new JScrollPane(txaSrc);
        jspSrc.setLocation(50,50);//设置滚动条后，不用设置大小与位置
        jspSrc.setSize(300,300);

        jspTarget = new JScrollPane(txaTarget);
        jspTarget.setLocation(380,50);//设置滚动条后，不用设置大小与位置
        jspTarget.setSize(300,300);

        Container window = this.getContentPane();
        this.setSize(750, 550);
        this.setLocationRelativeTo(null); //距中
        this.setTitle("自定义控件大小位置");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //退出窗口关闭程序
        this.setBackground(Color.pink); //设置窗体背景
        //取消窗体装饰后，标题栏就没有了
        //this.setUndecorated(true); //先要进行 Undecorate才可以使用 Opacity
        //this.setOpacity(0.9f); //设置不透明 0.0f -1.0f
        //设置布局为空，优点:摆放灵活，缺点：代码量大，自适应能力差。
        this.setLayout(null);

        //自定义文本域的位置 ，大小
        txaSrc.setLineWrap(true);  //自动换行
        //txaSrc.setLocation(50,50);//设置滚动条后，不用设置大小与位置
        //txaSrc.setSize(300,300);
        txaSrc.setFont(new Font("宋体", Font.BOLD, 20));
        //设置文本框的边框，颜色与宽度
        txaSrc.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
        //获取文档对象，并且加上撤销编辑的监听
        txaSrc.getDocument().addUndoableEditListener(undoManager);
        //添加 Key监听 Ctrl+Z
        txaSrc.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                //判断是否为 Ctrl + Z
                if(e.isControlDown() && e.getKeyCode()== KeyEvent.VK_Z){
                    //判断是否可以撤销
                    if(undoManager.canUndo()){
                        undoManager.undo();
                    }
                }
                //判断重做 Ctrl + Y
                if(e.isControlDown() && e.getKeyCode() == KeyEvent.VK_Y){
                    //判断是否可以重做
                    if(undoManager.canRedo()){
                        undoManager.redo();
                    }
                }
            }
        });

        txaTarget.setLineWrap(true);
        //txaTarget.setLocation(380,50);//设置滚动条后，不用设置大小与位置
        //txaTarget.setSize(300,300);
        txaTarget.setFont(new Font("宋体", Font.BOLD, 20));
        txaTarget.setBorder(BorderFactory.createLineBorder(Color.GRAY,1));
        //给文档对象添加监听
        txaTarget.getDocument().addUndoableEditListener(undoManager);
        //给文本域添加撤销与重做
        txaTarget.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                //判断是否为 Ctrl + Z
                if(e.isControlDown() && e.getKeyCode()== KeyEvent.VK_Z){
                    //判断是否可以撤销
                    if(undoManager.canUndo()){
                        undoManager.undo();
                    }
                }
                //判断重做 Ctrl + Y
                if(e.isControlDown() && e.getKeyCode() == KeyEvent.VK_Y){
                    //判断是否可以重做
                    if(undoManager.canRedo()){
                        undoManager.redo();
                    }
                }
            }
        });

        //设置按钮大小及字体
        btnAdd.setSize(80,40);
        btnAdd.setLocation(50, 400);
        btnAdd.setFont(new Font("宋体", Font.PLAIN, 20));
        btnAdd.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //在 txaSrc中添加字符到最后
                txaSrc.append("中华人民共和国，我爱你！");
            }
        });

        btnInsert.setSize(80,40);
        btnInsert.setLocation(140, 400);
        btnInsert.setFont(new Font("宋体", Font.PLAIN, 20));
        btnInsert.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //在 txaSrc插入字符
                txaSrc.insert("I Love You, China!", 0);
            }
        });

        btnSelectAll.setSize(80,40);
        btnSelectAll.setLocation(230, 400);
        btnSelectAll.setFont(new Font("宋体", Font.PLAIN, 20));
        btnSelectAll.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                txaSrc.requestFocus();//首先获取焦点，这样选择之后，整个字符串背景变蓝色
                txaSrc.selectAll(); //全选
            }
        });

        btnCopy.setSize(80,40);
        btnCopy.setLocation(320, 400);
        btnCopy.setFont(new Font("宋体", Font.PLAIN, 20));
        btnCopy.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //复制
                txaSrc.copy();
            }
        });

        btnPast.setSize(80,40);
        btnPast.setLocation(410, 400);
        btnPast.setFont(new Font("宋体", Font.PLAIN, 20));
        btnPast.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //粘贴到目标框
                txaTarget.paste();
            }
        });

        btnUndo.setSize(80,40);
        btnUndo.setLocation(500, 400);
        btnUndo.setFont(new Font("宋体", Font.PLAIN, 20));
        btnUndo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //撤销
                if(undoManager.canUndo()){
                    undoManager.undo();
                }
            }
        });

        btnRedo.setSize(80,40);
        btnRedo.setLocation(590, 400);
        btnRedo.setFont(new Font("宋体", Font.PLAIN, 20));
        btnRedo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //重做
                if(undoManager.canRedo()){
                    undoManager.redo();
                }
            }
        });

        //在窗体上加载文本域框 //将滚动条加入
        window.add(jspSrc);
        window.add(jspTarget);
        //window.add(txaSrc); //如果使用滚动条后，这个不要使用
        //window.add(txaTarget); //如果使用滚动条后，这个不要使用
        window.add(btnAdd);
        window.add(btnInsert);
        window.add(btnSelectAll);
        window.add(btnCopy);
        window.add(btnPast);
        window.add(btnUndo);
        window.add(btnRedo);
    }

    public static void main(String[] args) {
        TextAreaFrame textFrame = new TextAreaFrame();
        textFrame.setVisible(true);
    }
}
